package GenericLearn;



import org.junit.jupiter.api.Test;

import java.lang.invoke.CallSite;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-05 17:42
 * @description
 *
 * 1.泛型在继承方面的体现
 *     类A是类B的父类，但G<A>与G<B>是并列的类
 *     补充：类A是类B的父类，A<T>就是B<T>的父类，但赋值时T类型要一致
 *
 * 2.通配符的使用
 *    通配符： ?
 *    类A是类B的父类，但G<A>与G<B>是并列的类,但二者共同的父类是G<?>
 *
 */
public class GenericTest2 {
    /**
     * 继承相关
     */
    @Test
    public void test1(){
        //多态
        Object obj=null;
        String str=null;
        obj=str;

        List<Object> list1=null;
        List<String> list2=null;
        //list1=list2;
        //此处会报错

    }
    /**
     * 通配符的使用
     */
    @Test
    public void test2(){
        List<Object> list1=null;
        List<String> list2=null;
        list2=new ArrayList<>();
        list2.add("123");
        List<?> list=null;
        list=list1;
        list=list2;

        //添加（写入）对于List<?>就不能往里添加数据了
        //除了添加null
        //list.add(123);

        //获取（读取）
        //允许读取，读取类型为object
        Object o=list.get(0);
        System.out.println(o);
    }

    /**
     * 有限制条件的通配符的使用
     * A是B的父类
     * ? extends A
     *      G<? extend A> 可以作为G<A>和G<B>的子类,
     * ? super A
     *      G<? super A> 可以作为G<A>和G<B>的父类,
     */
    @Test
    public void test3(){
        List<? extends Person> list1=null;
        List<? super Person> list2=null;
        List<Student> list3=null;
        List<Person> list4=null;
        List<Object> list5=null;

        list1=list3;
        list1=list4;
//        list2=list1;
//        list2=list3;
        //读取数据
        list1=new ArrayList<>();
        list1.add(null);
        Person p= list1.get(0);
       // Object o=list2.get(0);//不能用Person了

        //写数据
        list2=new ArrayList<>();
        //list1.add(new Student());//会报错
        list2.add(new Person());
        list2.add(new Student());
        list1.forEach(System.out::println);//jdk8新特性
    }


}


class Person{

}

class Student extends Person{

}